####Chapter 1
###Item 1 先好好了解一下一下Objc或者C的语法
- 了解指针类型与值类型。
- 了解C语言的核心知识,对了解内存模型和指针有帮助
###Item 2 在类的头文件中尽量少引入其他头文件
- 在.h文件中尽量少取import其他.h文件
- 尽量用@class 在.h文件声明一下需要用到的类
- 如果需要继承一个父类,需要在子类.h文件中import父类的.h文件
- 如果一个.h文件中只有很简单的protocol,可以把这个.h文件包含进来
- 尽可能晚地将其他.h文件import进来,即尽量在.m文件中引用其他.h文件
- 协议尽量放在.m文件里面的
class-continuation category
里面声明要实现它
建议这样做:
EOCEmployer.h
1 | #import <Foundation/Foundation.h> |
EOCEmployer.m
1 | #import "EOCPerson.h" |
EOCPerson.h
1 | #import <Foundation/Foundation.h> |
EOCStudent.h,这个类继承了EOCPerson
1 | #import <Foundation/Foundation.h> |
1 | #import <Foundation/Foundation.h> |
###Item 3 多用字面量语法,少用与字面量等价的构造方法或者类方法
- 建议使用字面量语法(Literal Syntax) 来创建NSString,NSNumber,NSArray,NSDictionray对象
- 使用下标来访问NSArray的index或者NSDictionary的Key
- 在字面量语法中如果有nil值,会抛出异常,使用字面量语法要保证插入的值不为nil
- 限制性:只能插入Foundation框架中的对象,自定义的对象只能用非字面量语法插入
推荐用法
NSString :
1 | //NSString字面量语法 |
NSNumber:
1 | NSNumber *integerNumber = @1; |
NSArray与NSMutableArray:
1 | //注意,并不能@[@"a1",nil];这样使用,会崩。使用字面量语法容易崩溃,但更容易定位bug |
NSDictionary与NSMutableDictionary:
1 | NSDictionary *dic = @{@"k1" : @"1" , @"k2" : @2}; |
###Item4 多用有具体类型的常量,少用#define来定义常量
- 避免去使用#define定义常量,它们不具备具体类型,只是做了单纯替代。而且它们容易在没有任何警告的情况下被重复定义,从而产生不稳定的值。
- 定义
translation-unit-specific
(可以理解为定义只在某个.m里面供内部使用的)的常量,要加上static
const
关键字,这样常量就不会定义在global symbol table
,避免了不同.m文件中定义同样名字的常量造成冲突报错的问题。所以不需对它命名添加前缀。 - 如果要定义一个供外部使用的常量,在.h文件中使用extern关键字来定义。在.m文件中具体再指定具体值。.h文件使用extern来修饰的常量,会在
global symbol table
定义,所以要加入前缀来避免冲突。
假设要定义一个专门放NSNotification名字的文件
定义仅供内部使用的常量
EOCItem4.h:
1 | @interface EOCItem4 : NSObject |
EOCItem4.m:
1 | #import "EOCItem4.h" |
定义对外使用的常量
1 | //在EOCItem4Notifications.h中 |
###Item5 使用枚举去定义一些状态和选项
- 使用enum去定义一些状态和选项,使他们可读性更强
- 若使用enum去定义去定义一些可以一并使用选项型的常量,把它们的值定义为2的幂值,这样它们就可以用
|
运算符来一起使用了 - 用
NS_ENUM
或者NS_OPTIONS
来定义枚举,并且显示给出它的类型 - 当使用switch来判断一个枚举值的时候,建议不要写default,这样当增加一个新枚举时候编译器就会报警告。有时候并不需要去判断这个新增的枚举值,如果有default新增的枚举值就会走default这里,没有警告可能会使我们错误地通过default处理这个状态得会造成一些Bug。
定义了2个枚举,一个用作表示状态,一个用于选项型:
1 | typedef NS_ENUM(NSUInteger,EOCItem5State) { |
状态型枚举使用:
1 | EOCItem5State state = EOCItem5StateNone; |
选项型枚举使用:
1 | EOCItem5Option option = EOCItem5OptionA | EOCItem5OptionB | EOCItem5OptionC; |